package com.wangjiang.mario.admin.common.base;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wangjiang.mario.admin.common.object.UUidList;
import com.wangjiang.mario.admin.common.object.UUidListForBatchUpdate;
import com.wangjiang.mario.admin.common.output.MPage;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface BaseService<T extends BaseEntity> extends IService<T> {

    abstract MPage<T> basePage(Integer currentPageNumber, Integer pageSize, Object qo, Class<?> voClz);

    MPage<T> basePage(Integer currentPageNumber, Integer pageSize, Object qo);

    T baseGetByUUid(String uuid);

    Object baseGetByUUid(String uuid, Class<?> clz);

    MPage<T> basePage(Integer currentPageNumber, Integer pageSize, Wrapper<T> selectWrapper);

    /**
     * 插入一条记录（选择字段，策略插入）
     *
     * @param entity 实体对象
     */
    boolean baseSave(T entity);

    /**
     * TableId 注解存在更新记录，否插入一条记录
     *
     * @param entity 实体对象
     */
    boolean saveOrUpdate(T entity);

    /**
     * 根据 whereEntity 条件，更新记录
     *
     * @param entity        实体对象
     * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    boolean baseUpdate(T entity, Wrapper<T> updateWrapper);


    Collection<T> baseList();

    Collection<T> baseListByIds(Collection collection);

    Collection<T> baseListByField(String field, Collection collection);

    /**
     * 根据 ID 选择修改
     *
     * @param entity 实体对象
     */
    boolean baseUpdateById(T entity);

    boolean baseSaveBatch(Collection<T> entityList);

    boolean baseUpdateBatch(Collection<T> entityList);

    boolean baseUpdateBatch(Collection<T> entityList, int batchSize);

    /**
     * 插入（批量）
     *
     * @param entityList 实体对象集合
     * @param batchSize  插入批次数量
     */
    boolean baseSaveBatch(Collection<T> entityList, int batchSize);

    /**
     * 批量修改插入
     *
     * @param entityList 实体对象集合
     * @param batchSize  每次的数量
     */
    boolean baseSaveOrUpdateBatch(Collection<T> entityList, int batchSize);


    /**
     * 软删除
     *
     * @param id 主键ID
     */
    boolean baseSoftRemoveById(Serializable id);

    /**
     * 批量软删除
     *
     * @param idList 主键ID列表
     */
    boolean baseSoftRemoveByIds(Collection<? extends Serializable> idList);;

    Boolean baseBatchSoftRemoveByUUidList(UUidList uuidList);

    abstract Boolean baseUpdateBatch(UUidListForBatchUpdate<T> uuidListForBatchUpdate);

    List<T> list(T qo) throws IllegalAccessException;


    List<T> tree(T qo);

}
